package com.itHsuSE.demo1;

public class TernaryOperatorDetail {
    public static void main(String[] args) {
        /*推导
        1、因为计算机是以补码的方式运算的，因此先得到2的补码 => 2的原码 00000000 00000000 00000000 00000010
           2是整数在电脑占32bit(即4byte,4个字节)，所以有这么多0 而正数的原码反码补码都一样，所以补码也是这个
        2、得到3的补码 => 3的原码 00000000 00000000 00000000 00000011 补码也是这个
        3、按位与 & 全为1才为1，否则为0
                00000000 00000000 00000000 00000010
                00000000 00000000 00000000 00000011
            &   00000000 00000000 00000000 00000010     这是运算后的补码，而当我们看运算的结果时要看它的原码
            而运算后这个补码的最高位是0，0表示正数，因此这个补码也是原码
            而转化为10进制，最高位是0，则是正数，所以结果是 2
         */
        System.out.println(2&3);//2

        /*推导
        1、先得到-2的原码 => -2的原码 10000000 00000000 00000000 00000010
        2、因为计算机是以补码的方式运算的，所以再得到-2的补码，而得到补码要先得到反码
           -2的反码(符号位不变，其他位取反，即0变1，1变0) => 11111111 11111111 11111111 11111101
        3、-2的补码(反码 + 1) => 11111111 11111111 11111111 11111110
        4、~-2的操作，对-2的补码取反 => 00000000 00000000 00000000 00000001 这是运算后的补码
        5、 而运算后这个补码的最高位是0，0表示正数，因此这个补码也是原码
            而转化为10进制，最高位是0，则是正数，所以结果是 1
         */
        System.out.println(~-2);//1

        /*推导
        1、因为计算机是以补码的方式运算的，因此先得到2的补码 => 2的原码 00000000 00000000 00000000 00000010 补码也是这个
        2、~2的操作，对2的补码取反 11111111 11111111 11111111 11111101 这是运算后的补码
        3、因为最高位是1，所以这个是负数，而结果要看原码，所以要把这个补码转为原码，又因为是负数，所以不是一样的
           得到原码要从补码转为反码，反码 = 补码 - 1，11111111 11111111 11111111 11111100 这是运算后的反码
           反码转为原码，符号位不变，其他位取反  10000000 00000000 00000000 00000011 这是运算后的原码
        4、转为10进制，最高位是1，则为负数，所以结果是 -3
         */
        System.out.println(~2);//-3

        //这两个比较简单，可以模仿上面做一下
        System.out.println(2|3);//3
        System.out.println(2^3);//1
    }
}
